package cn.qicaiwang.open.websocket.service.impl;

import cn.hutool.core.util.IdUtil;

import cn.qicaiwang.open.common.entity.CrmMessage;
import cn.qicaiwang.open.common.entity.CrmSession;
import cn.qicaiwang.open.common.req.CrmMessageREQ;
import cn.qicaiwang.open.common.vo.CrmMessageVO;
import cn.qicaiwang.open.common.vo.CrmSessionVO;
import cn.qicaiwang.open.websocket.mapper.CrmMessageMapper;
import cn.qicaiwang.open.websocket.mapper.CrmSessionMapper;
import cn.qicaiwang.open.websocket.service.ICrmSessionService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

@Service
public class CrmSessionService extends ServiceImpl<CrmSessionMapper, CrmSession> implements ICrmSessionService {
    @Autowired
    private CrmSessionMapper crmSessionMapper;
    @Autowired
    private CrmMessageMapper crmMessageMapper;

    @Override
    public CrmSessionVO getByPartaker(String fromUserId, String toUserId) {
        return crmSessionMapper.getByPartaker(fromUserId, toUserId);
    }

    @Override
    public Page<CrmSessionVO> pagelist(Page page, String userId) {
        Page<CrmSessionVO> page1 = crmSessionMapper.page(page, userId);
        List<CrmSessionVO> records = page1.getRecords();
        records.stream().forEach((item) -> {
            Page p = new Page();
            p.setCurrent(1);
            p.setSize(1);

            CrmMessageREQ crmMessageREQ = new CrmMessageREQ();
            crmMessageREQ.setSessionId(item.getId());
            Page<CrmMessageVO> messages = crmMessageMapper.page(p, crmMessageREQ);
            item.setMessages(messages.getRecords());
        });
        page1.setRecords(records);
        return page1;
    }

    @Override
    public CrmSessionVO check(String fromUserId, String toUserId) {
        // 1. 先查询是否已存在会话
        CrmSessionVO session = crmSessionMapper.getByPartaker(fromUserId, toUserId);

        if (session == null) {
            // 2. 不存在会话则创建新会话
            CrmSession temp = new CrmSession();
            temp.setId(IdUtil.getSnowflakeNextIdStr()); // 雪花算法生成ID
            temp.setSessionName(temp.getId());
            temp.setPromoter(fromUserId); // 设置发起人
            temp.setPartaker(toUserId); // 设置参与者
            temp.setIsGroup(0); // 标记为单聊（非群聊）
            temp.setCreateBy(fromUserId); // 创建人
            temp.setCreateTime(new Date()); // 创建时间
            temp.setUpdateBy(fromUserId); // 更新人
            temp.setUpdateTime(new Date()); // 更新时间
            crmSessionMapper.insert(temp); // 插入数据库

            // 创建新的VO对象并复制属性
            session = new CrmSessionVO();
            BeanUtils.copyProperties(temp, session); // 属性拷贝到VO对象
        } else {
            // 3. 已存在会话则更新最后活跃时间
            CrmSession temp = new CrmSession();
            temp.setId(session.getId());
            temp.setUpdateBy(fromUserId); // 更新操作人
            temp.setUpdateTime(new Date()); // 更新最后活跃时间
            crmSessionMapper.updateById(temp); // 更新数据库
        }

        // 4. 查询该会话的最后一条聊天记录
        Page<CrmMessageVO> p = new Page<>();
        p.setCurrent(1); // 第一页
        p.setSize(1); // 每页1条
        CrmMessageREQ crmMessageREQ = new CrmMessageREQ();
        crmMessageREQ.setSessionId(session.getId()); // 设置会话ID条件
        Page<CrmMessageVO> messages = crmMessageMapper.page(p, crmMessageREQ); // 分页查询
        session.setMessages(messages.getRecords()); // 设置最后一条消息

        return session;
    }
    @Override
    public boolean delete(String id) {
        QueryWrapper<CrmMessage> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("session_id", id);
        crmMessageMapper.delete(queryWrapper);
        return crmSessionMapper.deleteById(id) > 0;
    }
}
